package myweb;

import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.log.Log;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;





public class DBUutil {
	
	
	
	private static String driver = "com.mysql.jdbc.Driver";// MySql驱动
	private static String user = "app";// MySQL的用户名和密码
    private static String password = "123456";
    private static String app_id,device_id,remark,mytime,state,device_type;
    private static JSONObject data=new JSONObject();
    
  //连接数据库的方法
    private static Connection getConn(String dbName){
        Connection connection;
         connection = null;
        try{
            Class.forName(driver);//加载驱动，需要驱动才能对数据库进行操作
            String ip = "118.31.20.121";//数据库的ip地址ַ

            //连接数据库，驱动+ip地址+端口号+用户名+密码，端口号默认是3306
            connection = (Connection) DriverManager.getConnection("jdbc:mysql://" + ip + ":3306/" + dbName,
                    user, password);
            

        }catch (Exception e){
            e.printStackTrace();
        
        }
        	//返回一个connection对象
        return connection;
    }
    //解绑设备
    public static void unbind_id(String app_id,String device_id) {
    	Connection connection=getConn("MQTTDATA");
    	if(connection!=null) {
    		String sql="delete from user_bind_devices where app_id=? and device_id=?";
    		PreparedStatement ps;
			try {
				ps = connection.prepareStatement(sql);
				if(ps!=null) {
					ps.setString(1, app_id);
					ps.setString(2, device_id);
					ps.execute();
					ps.close();
					connection.close();
				
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		
    	}
    }
    //这个是添加设备到数据库
    public static  void bind_id(String app_id,String device_id){
    	
             Connection connection=getConn("MQTTDATA");
        String sql="INSERT INTO user_bind_devices (app_id,device_id) VALUES (?,?)";
        if (connection!=null){
            try {
                PreparedStatement ps=connection.prepareStatement(sql);
                if (ps!=null){
                    ps.setString(1,app_id);
                    ps.setString(2,device_id);
                    //执行语句,注意！！！如果你的SQL 语句是诸如update,insert的更新语句，应该用statement的execute()方法
                    // select用的是statement的executeQuery()
                    ps.execute();
                    
                    connection.close();
                    ps.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
                
            }
        }
    }
    //获取已经绑定的设备
    public static Set<String> getBindDevices(String app_id){
        Set<String> devices=new HashSet<>();
        String device_id=null;
        Connection connection=getConn("MQTTDATA");
        String sql="select device_id from user_bind_devices where app_id=?";
        if (connection!=null){
      
            try {
                PreparedStatement ps= connection.prepareStatement(sql);
                if (ps!=null){
                    ps.setString(1,app_id);
                    ResultSet rs=ps.executeQuery();
                    if (rs!=null){
                        int count =rs.getMetaData().getColumnCount();
                        while   (rs.next()){
                            for (int i=1 ;i<=count;i++){
                                String field=rs.getMetaData().getColumnName(i);
                                
                                    device_id=rs.getString(field);
                                    
                            }
                            if (device_id!=null){
                                devices.add(device_id);
                            }
                            device_id=new String();
                        }
                        return devices;
                    }

                }


            } catch (SQLException e) {
                e.printStackTrace();
            }
        }else{
           
        }return null;

    }
  //获取当前绑定的设备的状态信息
    public  static  JSONArray getCurrentInfoByID(Iterator iterator){
      JSONArray jsonarray=new JSONArray();
      JSONObject jsonobject=new JSONObject();
        //创建一个存放esp设备的数组对象
       
        //连接数据库
         Connection connection=getConn("MQTTDATA");


        //读取指定条件的数据
        String sql="select * from current where device_id=?";
        if (connection!=null){
            //Log.e("db","getcurrent connect success");
            try {
                PreparedStatement ps=connection.prepareStatement(sql);
                if (ps!=null){
                    //判断迭代器是否读取完成，若还有id就继续读取数据库
                    while (iterator.hasNext()){
                        String id=iterator.next().toString();
                        ps.setString(1,id);
                        
                        ResultSet rs=ps.executeQuery();
                        
                        if (rs!=null){
                            int count =rs.getMetaData().getColumnCount();
                            while(rs.next()){
                                for (int i=1;i<=count;i++){
                                    String field=rs.getMetaData().getColumnName(i);
                                    //Log.e("esp now","键:  "+field);
                                    switch (field) {
                                       
                                        case "app_id":
                                        	jsonobject.put("app_id", rs.getString(field));
                                            break;
                                        case "device_id":
                                        	jsonobject.put("device_id", rs.getString(field));
                                            break;
                                        case "remark":
                                        	jsonobject.put("remark", rs.getString(field));
                                            break;
                                        case "state":
                                        	jsonobject.put("state", rs.getString(field));
                                            break;
                                        case "device_type":
                                        	jsonobject.put("device_type", rs.getString(field));
                                            break;
                                        case "mytime":
                                        	jsonobject.put("mytime", rs.getString(field));
                                    }

                                }
                            }     
                            
                                jsonarray.add(jsonobject);
                             jsonobject=new	JSONObject();
                            //注意一定要重新创建一个新对象
                           
                        }

                        else {
                            
                            return null;
                        }
                    }
                    connection.close();
                    ps.close();
                    
                    return jsonarray;

                }else return  null;
            } catch (SQLException e) {
                e.printStackTrace();
               
                 return  null;
            }
        }return  null;
           
    }
    //通过device——id查询历史记录
    public static JSONArray getHistoryInfoByID(String device_ID){
    	  JSONArray jsonarray=new JSONArray();
    	  JSONObject jsonobject=new JSONObject();
        // 根据数据库名称，建立连接
        Connection connection = getConn("MQTTDATA");

        try {
            // mysql简单的查询语句。可以使用查询，更新，删除等等，？是一个变量，在后面可以对？进行赋值，可以设置多个？
            String sql = "select * from history where device_id=?";

            if (connection != null){
                // connection不为null表示与数据库建立了连接
                //预编译sql 的，例如 preparedStatement("select * from t where id = ?");
                //然后传入参数的时候 ？ 就会替换成你所需要的参数。
                PreparedStatement ps = connection.prepareStatement(sql);
                if (ps != null){
                    // 设置上面的sql语句中第一个？的值为ID，如果有两个？，就再写一个ps.setString(2,String),
                    //  ?会被替换成ID所代表的值
                    ps.setString(1, device_ID);
                    // 执行sql查询语句并返回结果集  resultset 表示数据库结果集的数据表，通常通过执行查询数据库的语句生成。
                    ResultSet rs = ps.executeQuery();
                    //Log.e("prx","结果集：" + rs);
                    if (rs != null){
                        //如果结果集不为空，先获取列的总数
                        int count = rs.getMetaData().getColumnCount();
                        
                        //int x=0;
                        // ResultSet对象保持一个光标指向其当前的数据行。 最初，光标位于第一行之前。 next方法将光标移动到下一行，
                        // 并且由于在ResultSet对象中没有更多行时返回false ，因此可以在while循环中使用循环来遍历结果集。
                        while (rs.next()){
                            // 注意：下标是从1开始的
                            for (int i = 1;i <= count;i++){
                                //获取数据表的列的名称
                                String field = rs.getMetaData().getColumnName(i);
                                //Log.e("esp","键:  "+field);
                                
                                //通过键值来赋值给对应的ESP8266的元素
                                switch (field){
                                case "app_id":
                                	jsonobject.put("app_id", rs.getString(field));
                                    break;
                                case "device_id":
                                	jsonobject.put("device_id", rs.getString(field));
                                    break;
                                case "remark":
                                	jsonobject.put("remark", rs.getString(field));
                                    break;
                                case "state":
                                	jsonobject.put("state", rs.getString(field));
                                    break;
                                case "device_type":
                                	jsonobject.put("device_type", rs.getString(field));
                                    break;
                                case "mytime":
                                	jsonobject.put("mytime", rs.getString(field));
                                }
                       }
                            //把每个设备的保存到数组中
                            jsonarray.add(jsonobject);
                            //注意每次都要重新实例化Device！！！
                            jsonobject=new JSONObject();

                        
                        }

                        //关闭数据库连接
                        connection.close();
                        ps.close();
                        
                        return  jsonarray;
                    }else {
                        return null;
                    }
                }else {
                    return  null;
                }
            }else {
               
                return  null;
            }
        }catch (Exception e){
            e.printStackTrace();
            }
		return null;
            
            
        }

    //这个是把数据保存到MQTTDATA库的 history表格
    //我需要插入app_id，device_id。。。。。。
    public static void add(String app_id,String device_id,String mytime,String state,String data) {
    	//先跟MySQL数据库里的MQTTDATA库建立连接
    	Connection connection=getConn("MQTTDATA");
    	//定义一个语句，这个语句的功能是对current表格的app_id,device_id,remark,mytime,state,device_type列分别插入我们的参数的值
    	//这里的？可以看成一个傀儡，用ps.setString()方法可以将？替换成我们的参数的值
    	String sql="INSERT INTO history (app_id,device_id,mytime,state,data) VALUES (?,?,?,?,?)";
    	if	(connection!=null) {
    		try {
    			//准备我们的mysql操作语句
				PreparedStatement ps=connection.prepareStatement(sql);
				//把第一个？替换成参数里的app_id,第二个？替换成device_id........
				if(ps!=null) {
					ps.setString(1, app_id);
					ps.setString(2, device_id);
				
					ps.setString(3, mytime);
					ps.setString(4, state);
					ps.setString(5, data);
					ps.execute();
					connection.close();
					ps.close();
				}
			} catch (SQLException e) {
				
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    }
    //更新current表格的数据
    public static void update(String app_id,String state,String device_id) {
    	//先跟MySQL数据库里的MQTTDATA库建立连接
    	Connection connection=getConn("MQTTDATA");
    	//定义一个语句，这个语句的功能是对current表格的app_id,device_id,remark,mytime,state,device_type列分别插入我们的参数的值
    	//这里的？可以看成一个傀儡，用ps.setString()方法可以将？替换成我们的参数的值
    	String sql="update current set app_id=?,state=? where device_id=?";
    	if	(connection!=null) {
    		try {
    			//准备我们的mysql操作语句
				PreparedStatement ps=connection.prepareStatement(sql);
				//把第一个？替换成参数里的app_id,第二个？替换成device_id........
				if(ps!=null) {
					ps.setString(1, app_id);
				
					ps.setString(2, state);
					ps.setString(3, device_id);
					ps.execute();
					ps.close();
					connection.close();
					
				}
			} catch (SQLException e) {
				
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    }
   
  
}
